home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / LIBIP / drawline8.c < prev    next >
C/C++ Source or Header  |  1999-09-11  |  2KB  |  77 lines

  1. /* 
  2.  * drawline8.c
  3.  * 
  4.  * Practical Algorithms for Image Analysis
  5.  * 
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9. /* DRAWLINE8:   This function draws an 8-connected line of given intensity
  10.  *            between given coordinates on input/output image
  11.  *              The 8-connectedness of the line guarantees the minimum
  12.  *              number of line points between 2 ends on a discrete 
  13.  *              Cartesian grid.
  14.  *                     usage: nPts = drawline8 (image, imgSize,
  15.  *                                                      pt1, pt2, intensity)
  16.  */
  17.  
  18. #include <images.h>             /* picture file properties */
  19.  
  20. long
  21. drawline8 (image, imgSize, pt1, pt2, intensity)
  22.      unsigned char **image;     /* input/output image array */
  23.      struct point imgSize;      /* size of image array */
  24.      struct point pt1,          /* coord.s of begin. and end. of line */
  25.        pt2;
  26.      unsigned char intensity;   /* intensity value of line */
  27. {
  28.   register int x, y,            /* x,y coord.s of line */
  29.     xFinal, yFinal,             /* x,y final endpoint */
  30.     dx, dy;                     /* x, y differences */
  31.   long xInc, yInc,              /* x, y fixed increments */
  32.     xRun, yRun,                 /* x, y cumulative runs */
  33.     nPts;                       /* no. points drawn */
  34.  
  35. /* initialize endpoints */
  36.   x = pt1.x;
  37.   y = pt1.y;
  38.   xFinal = pt2.x;
  39.   yFinal = pt2.y;
  40.  
  41. /* determine x,y fixed increments */
  42.   dx = xFinal - x;
  43.   dy = yFinal - y;
  44.  
  45.   xInc = (dx > 0) ? 1 : -1;
  46.   yInc = (dy > 0) ? 1 : -1;
  47.  
  48. /* initialize cumulative x,y increments */
  49.   if (dx < 0)
  50.     dx = -dx;
  51.   if (dy < 0)
  52.     dy = -dy;
  53.  
  54.   yRun = dx;
  55.   xRun = dy;
  56.  
  57. /* join line endpoints */
  58.   image[y][x] = intensity;
  59.   nPts = 1;
  60.   while (x != xFinal || y != yFinal) {
  61.     if (xRun <= yRun) {
  62.       xRun += dy;
  63.       x += xInc;
  64.     }
  65.     if (xRun >= yRun) {
  66.       yRun += dx;
  67.       y += yInc;
  68.     }
  69.     image[y][x] = intensity;
  70.     nPts++;
  71.   }
  72.   image[y][x] = intensity;
  73.   nPts++;
  74.  
  75.   return (nPts);
  76. }
  77.